﻿namespace UIOC.CodeAnalysis;

public static class AttributeFullNames {
    public const string Implement = $"{NamespaceFullNames.Attributes}.{nameof(UIOC.Attributes.ImplementAttribute)}";
    public const string InstanceType = $"{NamespaceFullNames.Attributes}.{nameof(UIOC.Attributes.InstanceTypeAttribute)}";
    public const string Autowired = $"{NamespaceFullNames.Attributes}.{nameof(UIOC.Attributes.AutowiredAttribute)}";
    public const string FileField = $"{NamespaceFullNames.Attributes}.{nameof(UIOC.Attributes.FileFieldAttribute)}";
    public const string BeanRegister = $"{NamespaceFullNames.Attributes}.{nameof(UIOC.Attributes.BeanRegisterAttribute)}";
    public const string Internal = $"{NamespaceFullNames.Attributes}.{nameof(UIOC.Attributes.InternalAttribute)}";
    public const string SkipInternalValidation = $"{NamespaceFullNames.Attributes}.{nameof(UIOC.Attributes.SkipInternalValidationAttribute)}";
}

public static class NamespaceFullNames {
    public const string Attributes = $"{NamespaceNames.UIOC}.{NamespaceNames.Attributes}";
}

public static class NamespaceNames {
    public const string Internal = nameof(Internal);
    public const string UIOC = nameof(UIOC);
    public const string Attributes = nameof(Attributes);
}

public static class TypeFullNames {
    public const string InstanceType = $"{NamespaceFullNames.Attributes}.{TypeNames.InstanceType}";
    public const string IObject = $"{NamespaceNames.UIOC}.{TypeNames.IObject}";
    public const string IObjectInternal = $"{NamespaceNames.Internal}.{NamespaceNames.UIOC}.{TypeNames.IObjectInternal}";
    public const string IPooledObjectInternal = $"{NamespaceNames.Internal}.{NamespaceNames.UIOC}.{TypeNames.IPooledObjectInternal}";
    public const string IBeanObjectInternal = $"{NamespaceNames.Internal}.{NamespaceNames.UIOC}.{TypeNames.IBeanObjectInternal}";
    public const string Object = $"{NamespaceNames.UIOC}.{TypeNames.Object}";
    public const string Application = $"{NamespaceNames.UIOC}.{TypeNames.Application}";
    public const string ITypeMapInternal = $"{NamespaceNames.Internal}.{NamespaceNames.UIOC}.{TypeNames.ITypeMapInternal}";
    public const string TypeMap = $"{Application}.{TypeNames.TypeMap}";
    public const string IBean = $"{NamespaceNames.UIOC}.{TypeNames.IBean}";
    public const string DefaultBean = $"{NamespaceNames.UIOC}.{TypeNames.DefaultBean}";
    public const string SingletonBean = $"{NamespaceNames.UIOC}.{TypeNames.SingletonBean}";
    public const string IBeanInternal = $"{NamespaceNames.Internal}.{NamespaceNames.UIOC}.{TypeNames.IBeanInternal}";
    public const string IAutowiredInternal = $"{NamespaceNames.Internal}.{NamespaceNames.UIOC}.{TypeNames.IAutowiredInternal}";
}

public static class TypeNames {
    public const string InstanceType = nameof(UIOC.Attributes.InstanceType);
    public const string IObject = nameof(IObject);
    public const string IObjectInternal = nameof(IObjectInternal);
    public const string IPooledObjectInternal = nameof(IPooledObjectInternal);
    public const string IBeanObjectInternal = nameof(IBeanObjectInternal);
    public const string Object = nameof(Object);
    public const string Application = nameof(Application);
    public const string ITypeMapInternal = nameof(ITypeMapInternal);
    public const string TypeMap = nameof(TypeMap);
    public const string IBean = nameof(IBean);
    public const string DefaultBean = nameof(DefaultBean);
    public const string SingletonBean = nameof(SingletonBean);
    public const string IBeanInternal = nameof(IBeanInternal);
    public const string IAutowiredInternal = nameof(IAutowiredInternal);
}

public static class MemberNames {

    public static class ITypeMapInternal {
        public const string Register = nameof(Register);
    }

    public static class TypeMap {
        public const string Fetch = nameof(Fetch);
        public const string Instantiate = nameof(Instantiate);
        public const string Dispose = nameof(Dispose);
    }

    public static class IPooledObjectInternal {
        public const string Allocate = nameof(Allocate);
        public const string Release = nameof(Release);
    }

    public static class IObjectInternal {
        public const string Construct = nameof(Construct);
        public const string Dispose = nameof(Dispose);
    }

    public static class IObject {
        public const string IsDisposed = nameof(IsDisposed);
    }

    public static class IBeanInternal {
        public const string Object = nameof(Object);
        public const string Initialize = nameof(Initialize);
        public const string Dispose = nameof(Dispose);
        public const string GetBeanHashCode = nameof(GetBeanHashCode);
        public const string BeanEquals = nameof(BeanEquals);
    }

    public static class IAutowiredInternal {
        public const string Construct = nameof(Construct);
        public const string Allocate = nameof(Allocate);
        public const string Release = nameof(Release);
        public const string Dispose = nameof(Dispose);
    }
}